package com.ricky04.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

/**
 * 引入aop依赖
 * 编写aop切面类
 * spring.aop.auto=true 来设置是否开启aop
 * spring.aop.proxy-target-class=false 默认是false 是用jdk进行代理  但是需要继承接口 而且 获取对象的时候getBean的时候需要获取接口对象 而不是实现类
 *          设置为true则使用cglib代理。
 *
 *          exposeProxy设置为true则可以通过org.springframework.aop.framework.AopContext获取到代理对象 在事务失效的时候有用
 */

@Aspect
//@EnableAspectJAutoProxy(exposeProxy = true)
@Component
public class MyAop {

    @Before("PointCut()")
    public void log(){
        System.out.println("方法1前执行");
    }

    @Around("PointCut()")
    public void log2(ProceedingJoinPoint join) throws Throwable {
        System.out.println("方法前执行"+join.getThis());
        StopWatch stopWatch=new StopWatch();
        stopWatch.start();
        join.proceed();
        stopWatch.stop();
    }

    /**
     * 拦截到 ricky04下的子包中的Dao里面的方法  但是无法拦截子子包
     */
    @Pointcut(value = "execution(* com.ricky04.*.*Dao.*(..))")
    public  void PointCut2(){

    }
    /**
     * 拦截到 ricky04下的子包中的Dao里面的方法 也包括拦截子子包
     */
    @Pointcut(value = "execution(* com.ricky04.*..*Dao.*(..))")
    public  void PointCut(){

    }

}
